package ru.spb.nicetu.altx.mnemo.utils.widgets;

import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * Элемент ввода типа "ComboBox"
 */
public class ComboxFieldComposite extends AFieldComposite {

  // **************************************************************************//
  // Enums //
  // **************************************************************************//

  // **************************************************************************//
  // Members //
  // **************************************************************************//
  /**
   * Собственно combobox
   */
  private Combo mCombo;
  private ControlDecoration mComboDecoration;
  private Boolean isCorrect;
  private String mErrorDescription = "Необходимо выбрать значение";

  private ModifyListener mComboModify;
  
  // **************************************************************************//
  // Constructors //
  // **************************************************************************//

  /**
   * @param items
   *          список тескстовых значений для combobox-а
   * @param currentItem
   *          индекс начельного текущего в combobox-е значения (нумерация с 0)
   */
  public ComboxFieldComposite(Composite parent, int style, String[] items,
      int currentItem) {
    super(parent, style);

    mCombo.setItems(items);
    if (!((0 <= currentItem) && (currentItem < items.length))) {
      mCombo.setText("");
      setCorrect(false);
    } else {
      mCombo.select(currentItem);
    }
  }

  // **************************************************************************//
  // Getters //
  // **************************************************************************//

  // **************************************************************************//
  // Setters //
  // **************************************************************************//

  // **************************************************************************//
  // Publics //
  // **************************************************************************//
  @Override
  public void setFieldLayoutData(Object data) {
    super.setFieldLayoutData(data);
    mCombo.setLayoutData(data);
    layout();
  }

  @Override
  public boolean getFieldEnable() {
    return mCombo.isEnabled();
  }

  @Override
  public void setFieldEnable(boolean enable) {
    mCombo.setEnabled(enable);
    // чтобы сработал модифайЛистнер
    if (enable) {
      //чтобы точно сработал модифай
      int index = mCombo.getSelectionIndex();
      if (index!=-1) mCombo.select(index);
      else setCorrect(false);
    } else {
      setCorrect(true);
    }
  }

  /**
   * @return индекс текущего в combobox-е значения
   */
  public int getCurrentItem() {
    return mCombo.getSelectionIndex();
  }

  @Override
  public void addFieldModifyListener(final ModifyListener listener) {
    mCombo.addModifyListener(new ModifyListener() {
      public void modifyText(ModifyEvent e) {
        e.data = ComboxFieldComposite.this;
        listener.modifyText(e);
      }
    });
  }

  @Override
  public Boolean isCorrect() {
    return isCorrect;
  }

  @Override
  public String getErrorDescription() {
    return mErrorDescription;
  }

  // **************************************************************************//
  // Abstracts //
  // **************************************************************************//

  // **************************************************************************//
  // Protected //
  // **************************************************************************//
  @Override
  protected void createControls(Composite parent, int style) {
    mCombo = new Combo(this, style | SWT.READ_ONLY);
    mComboDecoration = createDecorator(mCombo);
    mComboModify = new ModifyListener() {
      public void modifyText(ModifyEvent evt) {
        setCorrect(true);
        if (mCombo.isEnabled()) {
          // && mCombo.getText().equals("")) {
          if (mCombo.getText() == null || mCombo.getText().equals(""))
            setCorrect(false);
        }
      }
    };
    mCombo.addModifyListener(mComboModify);
  }

  @Override
  protected ControlDecoration createDecorator(Control control) {
    ControlDecoration c = super.createDecorator(control);
    c.setDescriptionText(mErrorDescription);
    return c;
  }

  // **************************************************************************//
  // Privates //
  // **************************************************************************//
  private void setCorrect(boolean enable) {
    isCorrect = enable;
    if (enable) {
      mComboDecoration.hide();
    } else {
      mComboDecoration.show();
    }
  }

  // **************************************************************************//
  // Public Statics //
  // **************************************************************************//

  // **************************************************************************//
  // Private Statics //
  // **************************************************************************//

  // **************************************************************************//
  // Internal Classes //
  // **************************************************************************//
}
